#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <vector>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <cassert>

using namespace std;
#define forn(i, n) for (int i = 0; i < n; ++i)
#define ALL(a) a.begin(), a.end()
#define X first
#define Y second
#define sz(a) ((int)a.size())
#define L(a) sz(a)
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ms(a) memset(a,0,sizeof(a))
#define ms1(a) memset(a,-1,sizeof(a))

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;

const double PI = 3.1415926535897932384626433832795;

struct edge{
	int a,b,cap,flow;
};
vector<edge> e;
vector<vector<int> > vv,vv1,rv1;
void add_edge(int a,int b,int cap){
	int l = L(e);
	edge e1 = {a,b,cap,0};
	edge e2 = {b,a,0,0};
	vv[a].pb(l++);
	e.pb(e1);
	vv[b].pb(l);
	e.pb(e2);
}
int s,t;
int gl;
int used[10010];
bool d1[1010],d2[1010];

const int MAXN = 1010; 
const int INF = 1000000000; 
 
 
int n, d[MAXN], ptr[MAXN], q[MAXN];

 
bool bfs() {
	int qh=0, qt=0;
	q[qt++] = s;
	memset (d, -1, n * sizeof d[0]);
	d[s] = 0;
	while (qh < qt && d[t] == -1) {
		int v = q[qh++];
		for (size_t i=0; i<L(vv[v]); ++i) {
			int id = vv[v][i],
				to = e[id].b;
			if (d[to] == -1 && e[id].flow < e[id].cap) {
				q[qt++] = to;
				d[to] = d[v] + 1;
			}
		}
	}
	return d[t] != -1;
}
 
int dfs (int v, int flow) {
	if (!flow)  return 0;
	if (v == t)  return flow;
	for (; ptr[v]<L(vv[v]); ++ptr[v]) {
		int id = vv[v][ptr[v]],
			to = e[id].b;
		if (d[to] != d[v] + 1)  continue;
		int pushed = dfs (to, min (flow, e[id].cap - e[id].flow));
		if (pushed) {
			e[id].flow += pushed;
			e[id^1].flow -= pushed;
			return pushed;
		}
	}
	return 0;
}
 
int dinic() {
	int flow = 0;
	for (;;) {
		if (!bfs())  break;
		memset (ptr, 0, n * sizeof ptr[0]);
		while (int pushed = dfs (s, INF))
			flow += pushed;
	}
	return flow;
}


void dfs2(int v){
	d1[v] = true;
	used[v] = gl;
	for(int i = 0;i < L(vv1[v]);i++){
		int to = vv1[v][i];
		if(used[to]<gl)
			dfs2(to);
	}
}
void dfs3(int v){
	d2[v] = true;
	used[v] = gl;
	for(int i = 0;i < L(rv1[v]);i++){
		int to = rv1[v][i];
		if(used[to]<gl)
			dfs3(to);
	}
}

int main() {
#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#else
	/*freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);*/
#endif
	while(true){
		int m;
		scanf("%d%d",&n,&m);
		if(n==0)
			break;
		scanf("%d%d",&s,&t);
		e.clear();
		vv.clear();
		vv1.clear();
		vv1.resize(n);
		rv1.clear();
		rv1.resize(n);
		vv.resize(n);
		for(int i = 0;i < n;i++)
			d1[i] = false,d2[i] = false;
		s--;t--;
		for(int i = 0;i < m;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			a--;b--;
			add_edge(a,b,1);
		}
		int fl = dinic();
		int kol = 0;
		for(int i = 0;i < L(e);i++){
			if(e[i].cap - e[i].flow>0){
				int a = e[i].a;
				int b = e[i].b;
				vv1[a].pb(b);
				rv1[b].pb(a);
			}
		}
		gl++;
		dfs2(s);
		gl++;
		dfs3(t);
		for(int i = 0;i < L(e);i+=2){
			if(e[i].flow==0){
				int a = e[i].a;
				int b = e[i].b;
				if(d1[b] && d2[a])
					kol++;
			}
		}

		if(kol!=0){
			fl++;
		}
		printf("%d %d\n",fl,kol);
	}


	return 0;
}
